package com.xgc.book.bookserver.util;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @ClassNameAutoCode
 * @Author:王润之
 * @Description
 * @DateTime2023/11/20 15:57
 **/
public class AutoCode {
    /*获取项目根路径*/
    private static final String PROJECT_PATH = System.getProperty("user.dir");
    /*声明资源加载器*/
    private static ResourceBundle rb;

    /*静态代码块-初始化资源加载器*/
    static {
        rb = ResourceBundle.getBundle("application-db");
    }

    /*获取数据库配置信息*/
    private static final String URL = rb.getString("jdbc.url");
    private static final String DRIVER = rb.getString("jdbc.driver");
    private static final String USERNAME = rb.getString("jdbc.username");
    private static final String PASSWORD = rb.getString("jdbc.password");

    public static void main(String[] args) {
        /*初始化自动生成器*/
        AutoGenerator autoGenerator = new AutoGenerator();
        /*初始化数据源*/
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        /*配置数据源信息*/
        dataSourceConfig.setUrl(URL);
        dataSourceConfig.setDriverName(DRIVER);
        dataSourceConfig.setUsername(USERNAME);
        dataSourceConfig.setPassword(PASSWORD);
        /*指定数据库类型*/
        dataSourceConfig.setDbType(DbType.MYSQL);
        /*设置日期类型的转换*/
        dataSourceConfig.setTypeConvert(new MySqlTypeConvert() {
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                /*数据库类型包含date单词的，转换为java的Date类型*/
                if (fieldType.toLowerCase().contains("date")) {
                    return DbColumnType.DATE;
                }
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });

//        dataSourceConfig.setTypeConvert((globalConfig, fieldType) -> {
//            /*数据库类型包含date单词的，转换为java的Date类型*/
//            if (fieldType.toLowerCase().contains("date")) {
//                return DbColumnType.DATE;
//            }
//            return null;
//        });

        /*配置数据源到生成工具*/
        autoGenerator.setDataSource(dataSourceConfig);

        /*初始化全局配置信息*/
        GlobalConfig globalConfig = new GlobalConfig();
        /*配置文件输出路径*/
        globalConfig.setOutputDir(PROJECT_PATH + "/src/main/java");
        /*配置文件的作者名*/
        globalConfig.setAuthor("wrz");
        /*取消自动打开文件*/
        globalConfig.setOpen(false);
        /*取消覆盖文件*/
        globalConfig.setFileOverride(false);
        /*设置主键策略*/
        globalConfig.setIdType(IdType.AUTO);
        /*设置实体类名称格式*/
        globalConfig.setEntityName("%sBean");
        /*设置service接口名称格式，默认会多一个I*/
        globalConfig.setServiceName("%sService");
        /*设置service实现类名称格式*/
        globalConfig.setServiceImplName("%sServiceImpl");
        /*设置mapper文件名称格式*/
        globalConfig.setMapperName("%sMapper");
        /*设置controller文件名格式*/
        globalConfig.setControllerName("%sController");

        /*配置全局配置信息到生成器*/
        autoGenerator.setGlobalConfig(globalConfig);

        /*初始化软件包配置*/
        PackageConfig packageConfig = new PackageConfig();
        packageConfig
                .setParent("com.xgc.book.bookserver")
                .setEntity("bean")
                .setMapper("mapper")
                .setController("controller")
                .setService("service")
                .setServiceImpl("service.impl");
//        packageConfig.setEntity("bean");
//        packageConfig.setMapper("mapper");
//        packageConfig.setController("controller");
//        packageConfig.setService("service");
//        packageConfig.setServiceImpl("service.impl");

        /*包配置加载到执行器*/
        autoGenerator.setPackageInfo(packageConfig);

        /*初始化生成策略配置*/
        StrategyConfig strategyConfig = new StrategyConfig();
        /*关闭SQL的全局大写*/
        strategyConfig.setCapitalMode(false);
        /*配置表名和实体类转换的方式*/
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        /*配置字段名和属性名的转换方式*/
        strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
        /*配置要忽略的表名前缀*/
        strategyConfig.setTablePrefix("br_", "sys_");
        /*配置lombok*/
        strategyConfig.setEntityLombokModel(true);
        /*配置控制器使用RestController注解*/
        strategyConfig.setRestControllerStyle(true);
        /*配置实体类是否自动加载注解*/
        strategyConfig.setEntityTableFieldAnnotationEnable(true);
        /*配置要生成的表,不配置表示生成所有的表*/
//        strategyConfig.setInclude("sys_userinfo");

        /*加载策略到生成器*/
        autoGenerator.setStrategy(strategyConfig);

        /*初始化生成模板*/
        TemplateConfig templateConfig = new TemplateConfig();
        /*设置mapper配置文件输入*/
        templateConfig.setXml(null);

        /*加载模板到生成器*/
        autoGenerator.setTemplate(templateConfig);
        /*初始化自定义模板配置*/
        InjectionConfig injectionConfig = new InjectionConfig() {
            @Override
            public void initMap() {

            }
        };

        /*初始化文件输出解决方案集合*/
        List<FileOutConfig> focList = new ArrayList<>();
        /*声明模板*/
        String templatePath = "/templates/mapper.xml.vm";
        /*添加自定义配置*/
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return PROJECT_PATH + "/src/main/resources/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML;
            }
        });

        /*解决方案存入模板配置*/
        injectionConfig.setFileOutConfigList(focList);
        /*模板配置存入生成器*/
        autoGenerator.setCfg(injectionConfig);

        /*执行自动生成代码*/
        autoGenerator.execute();

    }
}
